#include "llcomp_llc.h"
typedef struct timeval CLOCK_TYPE;
double CLOCK_Avg (double t);
double CLOCK_Min (double t);
double CLOCK_Max (double t);
int *despl;
int *count;
double
jacobi_llc (double **a, int n, double *b, double *x, double tol, int maxit)
{

  int i;
  int j;
  int it = 0;
  double sum;
  double resi = 10.0;
  double *new_x;
  new_x = (double *) (malloc (n * sizeof (double)));
  for (i = 0; i < n; (i++))
    x[i] = b[i];
  while (it < maxit)
    {

      resi = 0.0;
#pragma omp
      ;

      {

	loopParallelFor0_support (b, (&j), (&n), a, (&resi), new_x, (&sum), x,
				  (&i));
      }

      ;
      for (i = 0; i < n; (i++))
	x[i] = new_x[i];
      (it++);
    }

  ;
  free (new_x);
  return resi;
}

;
int
llc_main (int argc, char *argv[])
{

  double tol;
  double **a;
  double *b;
  double *x;
  int i;
  int j;
  int n;
  int nfilas;
  int diag;
  int maxit;
  int nprocs;
  int miid;
  CLOCK_TYPE chrono;
  double llc_time;
  double llc_resi;
  nprocs = LLC_NUMPROCESSORS;
  miid = LLC_NAME;
  n = 200;
  maxit = 500;
  tol = 0.0000001;
  switch (argc)
    {

    case 4:
      tol = atof (argv[3]);
    case 3:
      maxit = atoi (argv[2]);
    case 2:
      n = atoi (argv[1]);
    }

  ;
  nfilas = n / nprocs;
  ReservaMatriz ((&a), n, n);
  ReservaVector ((&b), n);
  ReservaVector ((&x), n);
  if (miid == 0)
    {

      GeneraVector (b, n);
    }

  ;
  MPI_Bcast (b, n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  if (miid == 0)
    {

      GeneraMatriz (a, n, n);
      diag = 0;
      for (i = 0; i < n; (i++))
	{

	  for (j = 0; j < n; (j++))
	    a[i][diag] += a[i][j];
	  (diag++);
	}

      ;
    }

  ;
  for (i = 0; i < n; (i++))
    MPI_Bcast (a[i], n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  MPI_Barrier (MPI_COMM_WORLD);
  gettimeofday ((&chrono), NULL);
  llc_resi = jacobi_llc (a, n, b, x, tol, maxit);

  {

    CLOCK_TYPE ch2;
    gettimeofday ((&ch2), NULL);
    llc_time =
      (double) (ch2.tv_sec - chrono.tv_sec) +
      ((double) (ch2.tv_usec - chrono.tv_usec) / 1.0e6);
  }

  ;
  MPI_Barrier (MPI_COMM_WORLD);
  printf ("%d:%g:%g\n", LLC_NAME, llc_time, llc_resi);
  LiberaMatriz (a);
  LiberaVector (b);
  LiberaVector (x);
  return 0;
}

;
int
main (int argc, char **argv)
{

  int llc_return_code = 0;
  MPI_Init ((&argc), (&argv));
  MPI_Comm_rank (MPI_COMM_WORLD, (int *) ((&LLC_GLOBAL_NAME)));
  MPI_Comm_size (MPI_COMM_WORLD, (int *) ((&LLC_GLOBAL_NUMPROCESSORS)));
  LLC_NAME = LLC_GLOBAL_NAME;
  LLC_NUMPROCESSORS = LLC_GLOBAL_NUMPROCESSORS;
  llc_GlobalGroup = MPI_COMM_WORLD;
  llc_CurrentGroup = (&llc_GlobalGroup);
  llc_return_code = llc_main (argc, argv);
  MPI_Finalize ();
  return llc_return_code;
}

;
